How Microsoft Lost the API War describes the war inside Microsoft over development of the standard API (backwards/bugwards-compatible vs. incompatible-going-forward). The winning strategy of incompatible-going-forward (from what Joel Spolsky, the author, calls the MSDN camp) means great trouble for developers — trouble to the point that many developers now only target the Web. This is the most important Windows development article I have seen in a while.
IMHO, the necessity for Microsoft's bugwards-compatibility was created largely by choosing inadequate memory-management models in the OS. If the fastest and cleanest way to develop functionality is through the standard API, developers will usually choose that path. You didn't see many Unix developers bypassing system services during the 1980s and 1990s, because the standard API was the easiest way to make use of the functionality that you needed (including memory management, video drivers, and printer drivers). Microsoft's holes in their API forced developers to kludge around their API. Such kludges force either bugwards-compatibility on the part of the OS developers, or force application developers to learn the new API required by each new OS.
As a side note, just before the release of the IBM PC I saw a demonstration of a Unix-like OS by Lauren Weinstein and Leor Zolman that ran on 8080 machines, yet provided Unix command-line functionality as well as support for debugging CP/M programs. If Microsoft had developed a system like this with GUI support for IBM PC-compatibles, we developers would have been spared a whole lot of pain.